package br.sceweb.servico;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceException;
import javax.persistence.Query;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;

import br.sceweb.dominio.Empresa;
import br.sceweb.dominio.EstagioSupervisionado;
import br.sceweb.dominio.Fachada;

public class HibernateEstagioSupervisionadoDAO implements IEstagioSupervisionado{

	private static final EstagioSupervisionado EstagioSupervisionado = null;
	Logger logger = Logger.getLogger(HibernateEstagioSupervisionadoDAO.class);
	
	
	
	@Override
	public String cadastra(EstagioSupervisionado e) {
		logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>inicializando o procedimento cadastra");
		String codigoRetorno = "";
		try {
			EntityManagerFactory factory = Persistence.createEntityManagerFactory("sceweb");
			EntityManager em = factory.createEntityManager();
			em.getTransaction().begin();
			em.persist(e);
			em.getTransaction().commit();
			em.close();
			codigoRetorno = "Cadastro realizado com sucesso";
		} catch (PersistenceException exception) { // HibernateException
			codigoRetorno = "Erro no cadastro";
			logger.info("disparou um erro na transacao de persistencia do tipo PersistenceException = "
					+ exception.toString());
		}

		return codigoRetorno;

	}

	@Override
	public EstagioSupervisionado consultaRA(String ra) {
		EstagioSupervisionado estagio = null;
		try {
			EntityManagerFactory factory = Persistence.createEntityManagerFactory("sceweb");
			EntityManager em = factory.createEntityManager();
			String hql = " SELECT e FROM EstagioSupervisionado e WHERE e.ra = :ra";
			em.getTransaction().begin();
			Query query = em.createQuery(hql);
			query.setParameter("ra", ra);

			if (query.getResultList().size() == 0)
				return null;

			estagio = (br.sceweb.dominio.EstagioSupervisionado) query.getSingleResult();
			em.getTransaction().commit();

		} catch (HibernateException exception) {
			// throw new Exception("ERRO..... " );
			logger.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> excecao no consulta="	+ exception.getMessage());

		}  
		
		return estagio;
	}

	@Override
	
	public List<EstagioSupervisionado> consultaCNPJ(String cnpj) {
		List<EstagioSupervisionado> lista = new ArrayList<EstagioSupervisionado>();
		try {
			EntityManagerFactory factory = Persistence.createEntityManagerFactory("sceweb");
			EntityManager em = factory.createEntityManager();
			em.getTransaction().begin();
			Query query = em.createQuery("SELECT e from EstagioSupervisionado e");
			lista = query.getResultList();

		} catch (Throwable e) {
		}
		return lista;

	}

	@Override
	public List<EstagioSupervisionado> findAll() {
		List<EstagioSupervisionado> lista = new ArrayList<EstagioSupervisionado>();
		try {
			EntityManagerFactory factory = Persistence.createEntityManagerFactory("sceweb");
			EntityManager em = factory.createEntityManager();
			em.getTransaction().begin();
			Query query = em.createQuery("SELECT e from EstagioSupervisionado e");
			lista = query.getResultList();

		} catch (Throwable e) {
		}
		return lista;
	}

	@Override
	public void update(EstagioSupervisionado e) {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("sceweb");
		EntityManager em = factory.createEntityManager();

		em.getTransaction().begin();

		Query query = em.createQuery("UPDATE EstagioSupervisionado c SET c.nomeAluno = :nome, c.dataInicio =:inicio, c.dataTermino =: termino,"
				+ " c.empresa =: empresa, c.responsavel =: responsavel, c.curso =: curso, c.semestre =: semestre, c.turno =: turno, "
				+ "c.horasCumpridas = horasCumpridas, c.tipoEstagio =: tipoEstagio WHERE c.RA = :RA");
		query.setParameter("nome", e.getNome());
		query.setParameter("inicio", e.getInicio());
		query.setParameter("termino", e.getTermino());
		query.setParameter("empresa", e.getEmpresa());
		query.setParameter("responsavel", e.getResposavel());
		query.setParameter("curso", e.getCurso());
		query.setParameter("semestre", e.getSemestre());
		query.setParameter("turno", e.getTurno());
		query.setParameter("horasCumpridas", e.getCumprido());
		query.setParameter("tipoEstagio", e.getTipo());
		query.setParameter("RA", e.getRa());
		
		
		
		query.executeUpdate();
		logger.info(" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>resultado da query alterado");
		em.getTransaction().commit();

		em.close();
		factory.close();
		
	}

	@Override
	public int exclui(String ra) {
		logger.info("inicializando o procedimento");
		int codigoRetorno = 0;
		try {
			EntityManagerFactory factory = Persistence.createEntityManagerFactory("sceweb");
			EntityManager em = factory.createEntityManager();

			String jpql = " DELETE FROM EstagioSupervisionado e WHERE e.ra = :ra";
			em.getTransaction().begin();
			Query query = em.createQuery(jpql);
			query.setParameter("ra", ra);
			codigoRetorno = query.executeUpdate();
			logger.info(" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>resultado da query exclui ra ="+ ra + " e codigoRetorno =" + codigoRetorno + " excluido");
			em.getTransaction().commit();

		} catch (Exception exception) {
			exception.printStackTrace();

		}

		return codigoRetorno;
	}

}
